package com.wxy.netty.协议;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;

import java.util.List;

/**
 * 继承自ByteToMessageCodec的编解码器不能被共享
 * 想要共享编解码器继承自MessageToMessageCodec 添加@sharable并自定义encode decode方法
 * @author 47868
 */
public class MyServerCodec extends ByteToMessageCodec<Message> {

    @Override
    public void encode(ChannelHandlerContext channelHandlerContext, Message message, ByteBuf byteBuf) throws Exception {
        byteBuf.writeBytes(new byte[]{1,2,3,4});
        byteBuf.writeByte(1);
        byteBuf.writeByte(0);
        byteBuf.writeByte(0);
        byteBuf.writeByte(0);
        byteBuf.writeInt(1);
        byte[] bytes = message.getMessage().getBytes();
        byteBuf.writeInt(bytes.length);
        byteBuf.writeBytes(bytes);
    }

    @Override
    public void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        int magicNum = byteBuf.readInt();
        byte version = byteBuf.readByte();
        byte serializerType = byteBuf.readByte();
        byte messageType = byteBuf.readByte();
        byteBuf.readByte();
        int id = byteBuf.readInt();
        int length = byteBuf.readInt();
        byte[] bytes = new byte[length];
        byteBuf.readBytes(bytes);
        String message = new String(bytes, 0, length);
        //将消息传递到下一级handler
        list.add(message);
        System.out.println(magicNum);
        System.out.println(version);
        System.out.println(serializerType);
        System.out.println(messageType);
        System.out.println(id);
        System.out.println(message);
    }
}
